home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / gruppena.i < prev    next >
Text File  |  1997-10-26  |  31KB  |  890 lines

  1. IMPLEMENTATION MODULE GruppenAuswahl;
  2.  
  3. (*============================================================================
  4.  * Modul:               GruppenAuswahl
  5.  * Autor:               Johannes G”ttker-Schnetmann
  6.  * Beschreibung:        Dialoghandling fr Auswahl der angestellten Gruppen
  7.  *                      Wird gelesen aus kurzer Gruppenliste (IGK.TXT)
  8.  * Version:             2.0
  9.  * letzte Žnderung:     26.7.93
  10.  * ============================================================================
  11.  * Autor Datum     Version  Žnderung
  12.  *  DS   10.6.91   1.2      groáe Teile neu geschrieben. Gruppen werden jetzt
  13.  *                          sortiert angezeigt. Umgestellt auf mtTextfiles.
  14.  *                          Teilweise Code auch gestrafft!
  15.  *  DS   25.10.91  1.2x     Anpassung an neues Format von IGK mit Erl„uterungszeilen
  16.  *                          am Ende.
  17.  *  DS   26.07.93  2.0      Komplett neu geschrieben fr ITG und interne Gruppenliste
  18.  *)
  19.  
  20. FROM SYSTEM       IMPORT ADDRESS, TSIZE, ADR, CADR;
  21. IMPORT GrafBase;
  22. IMPORT BinOps;
  23. IMPORT Lists;
  24.  
  25. IMPORT MagicAES;
  26. IMPORT MagicDOS;
  27. IMPORT MausTauschrsc;
  28. IMPORT MagicStrings;
  29. IMPORT mtAppl;
  30. IMPORT WinDials;
  31. IMPORT mtUtils;
  32. IMPORT mtAlerts;
  33. IMPORT mtPopups;
  34.  
  35. IMPORT CatTypes;
  36. IMPORT CatFiles;
  37. IMPORT CatHelp;
  38. IMPORT CatGlobal;
  39. IMPORT MTE;
  40. IMPORT grinTools;
  41. IMPORT GroupSelect;
  42. IMPORT ListDl;
  43. IMPORT ListHelp;
  44. IMPORT Messages;
  45. IMPORT MTPaths;
  46. IMPORT ConfVars;
  47. IMPORT Infofiles;
  48. IMPORT VDIUtil;
  49. IMPORT Varnames;
  50. FROM ListDl       IMPORT ldElems;
  51. FROM Void         IMPORT v;
  52.  
  53. FROM GroupSelect IMPORT rwState, uState, netState, orderState;
  54.  
  55. CONST   cSelFollowup    = 'Followup ausw„hlen';
  56.         cSelGroup       = 'Gruppen ausw„hlen';
  57.  
  58. TYPE Trick =  POINTER TO RECORD
  59.                 CASE : BOOLEAN OF
  60.                   TRUE:  wert: INTEGER;|
  61.                   FALSE: hi: CHAR;
  62.                          lo: CHAR;|
  63.                 END;
  64.               END;
  65.  
  66. VAR grList  : Lists.List;
  67.     groups  : ADDRESS;
  68.     globalLength: INTEGER;
  69.     maxGroupNameLength : INTEGER;
  70.     isSysop : BOOLEAN;
  71.  
  72. PROCEDURE ExtendStr (VAR str : ARRAY OF CHAR; len : CARDINAL);
  73.   VAR (*$Reg*) max, 
  74.       (*$Reg*) s, 
  75.       (*$Reg*) i : CARDINAL;
  76. BEGIN
  77.   IF len > HIGH (str) THEN max := HIGH(str) ELSE max := len END;
  78.   s := LENGTH (str);
  79.   IF s < len
  80.   THEN
  81.     FOR i := s TO max DO str[i] := ' '; END;
  82.     IF max < HIGH (str) THEN str[max+1] := 0C; END;
  83.   ELSE
  84.     (* Nur ein Space anh„ngen *)
  85.     str[s] := ' ';
  86.     str[s+1] := 0C;
  87.   END;
  88. END ExtendStr;
  89.  
  90. PROCEDURE selGrEntry (entry, env : ADDRESS; line : INTEGER): BOOLEAN;
  91.   VAR gr : GroupSelect.groupPtr;
  92.       str: ARRAY [0..255] OF CHAR;
  93. BEGIN
  94.   gr := entry;
  95.   IF gr = NIL THEN RETURN FALSE END;
  96.   gr^.selected := ~gr^.selected;
  97.   IF gr^.selected & (line >= 0) THEN
  98.     mtUtils.SetObjcString (groups, MausTauschrsc.grname, gr^.name^); 
  99.     WinDials.WinDialDraw (groups, MausTauschrsc.grname, 0, v.r, FALSE);
  100.   END;
  101.   RETURN FALSE
  102. END selGrEntry;
  103.  
  104. PROCEDURE groupToStr (entry, env : ADDRESS; VAR str : ARRAY OF CHAR);
  105.   VAR gr : GroupSelect.groupPtr;
  106. BEGIN
  107.   gr := entry;
  108.   IF gr = NIL THEN RETURN END;
  109.   MagicStrings.Assign (gr^.name^,str);
  110. END groupToStr;
  111.  
  112. PROCEDURE buildGroup (entry, env : ADDRESS; VAR str : ARRAY OF CHAR);
  113.   VAR gr : GroupSelect.groupPtr;
  114. BEGIN
  115.   gr := GroupSelect.groupPtr (entry);
  116.   IF ((gr^.readState = rwOn) OR (gr^.readState = rwDefault)) & (gr^.ordered # oOff)
  117.   THEN
  118.     MagicStrings.Assign (10C+' ', str);
  119.   ELSIF (gr^.ordered = oOff)
  120.   THEN
  121.     MagicStrings.Assign ('- ', str);
  122.   ELSIF (gr^.ordered = oOn)
  123.   THEN
  124.     MagicStrings.Assign ('+ ', str);
  125.   ELSE
  126.     MagicStrings.Assign ('  ', str);
  127.   END;
  128.   MagicStrings.Append (gr^.name^,str);
  129.   IF gr^.followup # NIL
  130.   THEN
  131.     MagicStrings.Append (' '+3C+0C, str);
  132.   END;
  133.   ExtendStr (str, maxGroupNameLength+5);
  134.   IF gr^.kurztext # NIL THEN MagicStrings.Append (gr^.kurztext^, str); END;
  135.   globalLength := BinOps.HigherInt (globalLength, LENGTH (str)+1);
  136. END buildGroup;
  137.  
  138. (*$Z-*)  
  139. PROCEDURE findSel (e, i : ADDRESS): BOOLEAN;
  140.   VAR entry : GroupSelect.groupPtr;
  141. BEGIN
  142.   entry := e;
  143.   RETURN entry^.selected;
  144. END findSel;
  145. (*$Z=*)
  146.  
  147. (*
  148. CONST   isUnOrdered = '[2][CAT:|Diese Gruppe ist bereits abgestellt.|Doch nicht abstellen?][[Ja|:[Nein]';
  149.         isOrdered   = '[2][CAT:|Diese Gruppe ist bereits angestellt.|Doch nicht bestellen?][[Ja|:[Nein]';
  150. *)
  151.  
  152. VAR     Adressat    : CatTypes.String255;
  153.         Wegen       : CatTypes.String255;
  154.  
  155. PROCEDURE orderGroup (obj: INTEGER; env, info: ADDRESS; VAR draw : BOOLEAN; VAR exit : BOOLEAN);
  156.   VAR oneSel : BOOLEAN;
  157.       gr     : GroupSelect.groupPtr;
  158. BEGIN
  159.   exit := FALSE;
  160.   draw := TRUE;
  161.   Lists.ResetList (grList);
  162.   Lists.ScanEntries (grList, Lists.forward, findSel, NIL, oneSel);
  163.   IF oneSel
  164.   THEN
  165.     (* Gruppe an oder abbestellen *)
  166.     gr := Lists.CurrentEntry (grList);
  167.     CASE gr^.readState OF
  168.       rwOn        : IF gr^.ordered # oNA
  169.                     THEN
  170.                       gr^.ordered := oNA
  171.                       (* 
  172.                       v.int := mtAlerts.Alert (1, isUnOrdered);
  173.                       IF v.int = 1
  174.                       THEN
  175.                         gr^.ordered := oNA
  176.                       ELSE
  177.                         draw := FALSE;
  178.                       END;
  179.                       *)
  180.                     ELSE
  181.                       gr^.ordered := oOff;
  182.                     END; |
  183.       rwNA,
  184.       rwPossible  : IF gr^.ordered # oNA
  185.                     THEN 
  186.                       gr^.ordered := oNA;
  187.                       (*
  188.                       v.int := mtAlerts.Alert (1, isOrdered);
  189.                       IF v.int = 1
  190.                       THEN
  191.                         gr^.ordered := oNA
  192.                       ELSE
  193.                         draw := FALSE;
  194.                       END;
  195.                       *)
  196.                     ELSE
  197.                       gr^.ordered := oOn; 
  198.                     END; |
  199.       rwAskChef   : v.int := mtAlerts.Alert (1, MTE.orderChef);
  200.                     IF v.int = 1
  201.                     THEN
  202.                       MagicStrings.Assign ('Chef ', Adressat);
  203.                       MagicStrings.Append (gr^.name^, Adressat);
  204.                       MagicStrings.Assign ('Gruppe ', Wegen);
  205.                       MagicStrings.Append (gr^.name^, Wegen);
  206.                       exit := TRUE;
  207.                       draw := FALSE;
  208.                     END; |
  209.       rwAskSysop  : v.int := mtAlerts.Alert (1, MTE.orderSysop);
  210.                     IF v.int = 1
  211.                     THEN
  212.                       MagicStrings.Assign ('Sysop', Adressat);
  213.                       MagicStrings.Assign ('Gruppe ', Wegen);
  214.                       MagicStrings.Append (gr^.name^, Wegen);
  215.                       draw := FALSE;
  216.                       exit := TRUE;
  217.                     END; |
  218.       rwImpossible: draw := FALSE; MTE.info (MTE.orderImpossible); |
  219.       rwDefault   : draw := FALSE; MTE.info (MTE.unOrderImpossible); |
  220.       rwNoPermission: draw := FALSE; MTE.info (MTE.orderNoPermission); |
  221.     ELSE
  222.     END;
  223.   END;
  224.   mtUtils.ExclState (groups, obj, MagicAES.SELECTED);
  225.   WinDials.WinDialDraw (groups, obj, 1, v.r, FALSE);
  226. END orderGroup;
  227.  
  228. PROCEDURE doChef (obj: INTEGER; env, info: ADDRESS; VAR draw, exit: BOOLEAN);
  229.   CONST title = "Gruppenchef setzen";
  230.         cname = "Chef:";
  231.         CR      = 15C;
  232.         LF      = 12C;
  233. VAR cmd,
  234.     uName: CatTypes.String255;
  235.     out  : INTEGER;
  236.     but  : INTEGER;
  237.     wegen: ADDRESS;
  238.     gr      : GroupSelect.groupPtr;
  239.     oneSel  : BOOLEAN;
  240. BEGIN
  241.   (* Neuen Dialog aufmachen und nach Usernamen fragen
  242.    *)
  243.   Lists.ResetList (grList);
  244.   Lists.ScanEntries (grList, Lists.forward, findSel, NIL, oneSel);
  245.   IF oneSel
  246.   THEN
  247.     (* Followup fr Gruppe einstellen *)
  248.     gr := Lists.CurrentEntry (grList);
  249.     
  250.     wegen := MausTauschrsc.TreeAddr^[MausTauschrsc.wegen];
  251.     mtUtils.SetObjcStringAdr (wegen, MausTauschrsc.wgruppe, gr^.name);
  252.     mtUtils.SetObjcStringAdr (wegen, MausTauschrsc.optstr,  CADR(title));
  253.     mtUtils.SetObjcStringAdr (wegen, MausTauschrsc.prestr,  CADR(cname));
  254.     mtUtils.SetObjcString (wegen, MausTauschrsc.wegenstr, "");
  255.     but := VDIUtil.FormHandle (wegen);
  256.     IF but = MausTauschrsc.wegenok
  257.     THEN
  258.       mtUtils.ObjcString (wegen, MausTauschrsc.wegenstr, uName);
  259.       IF LENGTH (uName) = 0
  260.       THEN
  261.         MTE.info (MTE.noChefSelected);
  262.       ELSE
  263.         (* User als Chef setzen *)
  264.         out := CatFiles.OpenFile(MTPaths.MessagePath, 'grselect.inf', CatFiles.writeFile);
  265.         IF out < 0 THEN
  266.           MTE.info (MTE.changeNoSave);
  267.         ELSE
  268.           CatFiles.Seek(0, out, CatFiles.end);
  269.         END;
  270.         IF out > 0 THEN
  271.           (* Kommandostring bauen *)
  272.           MagicStrings.Assign(":GU", cmd);
  273.           MagicStrings.Append(uName, cmd);
  274.           MagicStrings.Append("=", cmd);
  275.           MagicStrings.Append(gr^.name^, cmd);
  276.           CatFiles.WriteMuch(LONG(MagicStrings.Length(cmd)), out, ADR(cmd));
  277.           CatFiles.WriteFile(CR, out); 
  278.           CatFiles.WriteFile(LF, out);
  279.           CatFiles.CloseFile(out);
  280.         END;
  281.       END;
  282.     END;
  283.   END;
  284.   mtUtils.ExclState (groups, obj, MagicAES.SELECTED);
  285.   WinDials.WinDialDraw (groups, obj, 1, v.r, FALSE);
  286.   draw := FALSE;
  287.   exit := FALSE;
  288. END doChef;
  289.  
  290. PROCEDURE doHelp (obj: INTEGER; env, info: ADDRESS; VAR draw, exit: BOOLEAN);
  291. BEGIN
  292.   CatHelp.DoHelp (CatHelp.selectGroup);
  293.   mtUtils.ExclState (groups, obj, MagicAES.SELECTED);
  294.   WinDials.WinDialDraw (groups, obj, 1, v.r, FALSE); 
  295.   draw := FALSE;
  296.   exit := FALSE;
  297. END doHelp;
  298.  
  299. PROCEDURE switchSort  (obj: INTEGER; env, info: ADDRESS; VAR draw, exit: BOOLEAN);
  300.   VAR typeSel : mtUtils.tObjcTree;
  301.       tree    : mtUtils.tObjcTree;
  302.       x, y          : INTEGER;
  303.       select        : INTEGER;
  304.       t             : Trick;
  305.       sort          : GroupSelect.selSortType;
  306.       but           : INTEGER;
  307. BEGIN
  308.   (* Liste aktualisieren *)
  309.   GroupSelect.DeleteList (grList);
  310.  
  311.   tree := groups;
  312.   typeSel := MausTauschrsc.TreeAddr^[MausTauschrsc.sorttype];
  313.   but := obj;
  314.   CASE obj OF 
  315.     MausTauschrsc.grsort0,
  316.     MausTauschrsc.grsort1: 
  317.            but := MausTauschrsc.grsort1;
  318.            MagicAES.ObjcOffset (tree, but, x, y);
  319.            t := ADR (tree^[but].obState);
  320.            select := mtPopups.TreePopup (typeSel, x, y, ORD(t^.hi))-1;
  321.            IF select >= 0 THEN
  322.              t^.hi := CHR(select);
  323.              VDIUtil.SetXString (tree, but, typeSel, select);
  324.              WinDials.WinDialDraw (tree, but, 0, v.r, FALSE);
  325.            END;|
  326.     MausTauschrsc.grsort2:
  327.            t := ADR (tree^[but-1].obState);
  328.            t^.hi := CHR((ORD(t^.hi)+1) MOD 3);
  329.            select := ORD (t^.hi);
  330.            VDIUtil.SetXString (tree, but-1, typeSel, select);
  331.            WinDials.WinDialDraw (tree, but-1, 0, v.r, FALSE); |
  332.   ELSE
  333.   END;
  334.   sort := GroupSelect.selSortType(VDIUtil.GetXState (tree, MausTauschrsc.grsort1));
  335.   v.bool := ConfVars.SetConfigInt (cSortSelectList, VDIUtil.GetXState (tree, MausTauschrsc.grsort1));
  336.   
  337.   IF mtUtils.InState (groups, MausTauschrsc.grlokal, MagicAES.SELECTED)
  338.   THEN
  339.     v.bool := GroupSelect.GetSelectList (grList, TRUE, sort);
  340.   ELSE
  341.     (* Nur Liste der lokal vorhandenen Gruppen holen *)
  342.     v.bool := GroupSelect.GetSelectList (grList, FALSE, sort);
  343.   END;
  344.   draw := TRUE;
  345.   exit := FALSE;
  346. END switchSort;
  347.  
  348. PROCEDURE switchLokal (obj: INTEGER; env, info: ADDRESS; VAR draw, exit: BOOLEAN);
  349.   VAR sort          : GroupSelect.selSortType;
  350. BEGIN
  351.   sort := GroupSelect.selSortType(VDIUtil.GetXState (groups, MausTauschrsc.grsort1));
  352.   GroupSelect.DeleteList (grList);
  353.   IF mtUtils.InState (groups, obj, MagicAES.SELECTED)
  354.   THEN
  355.     v.bool := GroupSelect.GetSelectList (grList, TRUE, GroupSelect.sName);
  356.     v.bool := ConfVars.SetConfigBool (cLokalSelectList, TRUE);
  357.   ELSE
  358.     (* Nur Liste der lokal vorhandenen Gruppen holen *)
  359.     v.bool := GroupSelect.GetSelectList (grList, FALSE, GroupSelect.sName);
  360.     v.bool := ConfVars.SetConfigBool (cLokalSelectList, FALSE);
  361.   END;
  362.   draw := TRUE;
  363.   exit := FALSE;
  364. END switchLokal;
  365.  
  366. VAR followUpSelect  : BOOLEAN;
  367.     followUpEntry   : GroupSelect.groupPtr;
  368.  
  369. PROCEDURE followUpTo (obj: INTEGER; env, info: ADDRESS; VAR draw : BOOLEAN; VAR exit : BOOLEAN);
  370.   VAR gr : GroupSelect.groupPtr;
  371.       oneSel : BOOLEAN;
  372.       newFollowup: BOOLEAN;
  373.       r     : mtUtils.tRect;
  374.   
  375.   PROCEDURE drawBack (obj: INTEGER);
  376.   BEGIN
  377.     mtUtils.CalcArea (groups, obj, r);
  378.     INC (r.w, 2); INC (r.h, 2);
  379.     WinDials.WinDialDraw (groups, 0, 8, r, TRUE);
  380.   END drawBack;
  381.   
  382. BEGIN
  383.   exit := FALSE;
  384.   draw := FALSE;
  385.   Lists.ResetList (grList);
  386.   Lists.ScanEntries (grList, Lists.forward, findSel, NIL, oneSel);
  387.   IF oneSel
  388.   THEN
  389.     (* Followup fr Gruppe einstellen *)
  390.     gr := Lists.CurrentEntry (grList);
  391.     IF gr^.followup # NIL
  392.     THEN
  393.       v.int := mtAlerts.Alert (2, MTE.followUpDefined);
  394.       newFollowup := v.int = 2;
  395.       IF v.int = 1
  396.       THEN
  397.         (* Followup l”schen *)
  398.         GroupSelect.SetFollowUp (gr, "");
  399.         draw := TRUE;
  400.       END;
  401.     ELSE
  402.       v.int := mtAlerts.Alert (1, MTE.noFollowUp);
  403.       newFollowup := v.int = 1;
  404.     END;
  405.     IF newFollowup
  406.     THEN
  407.       (* Neuer Modus! *)
  408.       (* Jetzt die beiden Buttons verstecken *)
  409.       mtUtils.SetFlag (groups, MausTauschrsc.grorder, MagicAES.HIDETREE, TRUE);
  410.       mtUtils.SetFlag (groups, MausTauschrsc.grchef, MagicAES.HIDETREE, TRUE);
  411.       mtUtils.SetFlag (groups, MausTauschrsc.grfollow, MagicAES.HIDETREE, TRUE);
  412.       drawBack (MausTauschrsc.grchef);
  413.       drawBack (MausTauschrsc.grorder);
  414.       drawBack (MausTauschrsc.grfollow);
  415.       (* Neuen Titel setzen *)
  416.       mtUtils.SetObjcString (groups, MausTauschrsc.grtitle, cSelFollowup);
  417.       WinDials.WinDialDraw (groups, MausTauschrsc.grtitle, 8, v.r, FALSE);
  418.       WinDials.WinUpdateTitle (groups);
  419.       MTE.info (MTE.selFollowUp);
  420.       followUpSelect := TRUE;
  421.       followUpEntry := gr;
  422.     END;
  423.   END;
  424.   mtUtils.ExclState (groups, obj, MagicAES.SELECTED);
  425.   WinDials.WinDialDraw (groups, obj, 1, v.r, FALSE);
  426. END followUpTo;
  427.  
  428. VAR buttonOrder : BOOLEAN;
  429.  
  430. PROCEDURE ExtraktValue (REF source: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR);
  431.   VAR p: CARDINAL;
  432. BEGIN
  433.   MagicStrings.Assign ("", dest);
  434.   p := MagicStrings.Pos (":", source, 0, FALSE);
  435.   IF p <= LENGTH (source)
  436.   THEN
  437.     MagicStrings.Copy (source, p+1, LENGTH (source) - p - 1, dest);
  438.   END;
  439. END ExtraktValue;
  440.  
  441. PROCEDURE updateButton (entry, env : ADDRESS);
  442.   VAR oneSel : BOOLEAN;
  443.       gr     : GroupSelect.groupPtr;
  444.       str    : CatTypes.String255;
  445.       str2   : CatTypes.String255;
  446.       r1, r2 : GrafBase.Rectangle;
  447.       grIsOn : BOOLEAN;
  448.       sort   : GroupSelect.selSortType;
  449. BEGIN
  450.   Lists.ResetList (grList);
  451.   Lists.ScanEntries (grList, Lists.forward, findSel, NIL, oneSel);
  452.   IF oneSel
  453.   THEN
  454.     (* Die Textzeilen unten mit Zusatzinfos fllen *)
  455.     gr := Lists.CurrentEntry (grList);
  456.     (* Erste Zeile: Textinfos *)
  457.     MagicStrings.Assign ('', str);
  458.     IF gr^.chef # NIL
  459.     THEN
  460.       MagicStrings.Append ('Chef: ', str);
  461.       MagicStrings.Append (gr^.chef^, str);
  462.       MagicStrings.Append ('  ', str);
  463.     END;
  464.     IF gr^.netname # NIL
  465.     THEN
  466.       MagicStrings.Append ('Netzname: ', str);
  467.       MagicStrings.Append (gr^.netname^, str);
  468.       MagicStrings.Append ('  ', str);
  469.     END;
  470.     IF gr^.followup # NIL
  471.     THEN
  472.       MagicStrings.Append ('Follow-Up: ', str);
  473.       MagicStrings.Append (gr^.followup^, str);
  474.       MagicStrings.Append ('  ', str);
  475.     END;
  476.     IF gr^.alias # NIL
  477.     THEN
  478.       MagicStrings.Append ('Alias: ', str);
  479.       MagicStrings.Append (gr^.alias^, str);
  480.       MagicStrings.Append ('  ', str);
  481.     END;
  482.     sort := GroupSelect.selSortType(VDIUtil.GetXState (groups, MausTauschrsc.grsort1));
  483.     IF (sort = GroupSelect.sNet) 
  484.     THEN
  485.       IF (gr^.herkunft # NIL)
  486.       THEN
  487.         MagicStrings.Append ('Netz: ', str);
  488.         ExtraktValue (gr^.herkunft^, str2);
  489.         MagicStrings.Append (str2, str);
  490.       END;
  491.     ELSIF (sort = GroupSelect.sLang) 
  492.     THEN
  493.       IF (gr^.sprache # NIL)
  494.       THEN
  495.         MagicStrings.Append ('Sprache: ', str);
  496.         ExtraktValue (gr^.sprache^, str2);
  497.         MagicStrings.Append (str2, str);
  498.       END;
  499.     END;
  500.     mtUtils.SetObjcString (groups, MausTauschrsc.groupinf1, str);
  501.     (* Zweite Zeile: Flags auswerten *)
  502.     MagicStrings.Assign ('', str);
  503.     IF (gr^.isNet # nNetForbid)
  504.     THEN
  505.       IF (gr^.readState # rwNA)
  506.       THEN
  507.         MagicStrings.Append ('Lesen: ', str);
  508.         CASE gr^.readState OF
  509.           rwOn    : MagicStrings.Append ('ist an', str) |
  510.           rwPossible  : MagicStrings.Append ('anstellbar', str) |
  511.           rwAskChef   : MagicStrings.Append ('Chef fragen', str) |
  512.           rwAskSysop  : MagicStrings.Append ('Sysop fragen', str) |
  513.           rwImpossible: MagicStrings.Append ('unm”glich', str) |
  514.           rwDefault   : MagicStrings.Append ('immer an', str) |
  515.           rwNoPermission  : MagicStrings.Append ('nicht erlaubt', str) |
  516.         ELSE
  517.         END;
  518.         MagicStrings.Append ('  ', str);
  519.       END;
  520.       IF (gr^.writeState # rwNA) 
  521.       THEN
  522.         IF gr^.writeState # rwNoPermission
  523.         THEN
  524.           MagicStrings.Append ('Schreiben: ', str);
  525.         END;
  526.         CASE gr^.writeState OF
  527.           rwOn    : MagicStrings.Append ('ist m”glich', str) |
  528.           rwPossible  : MagicStrings.Append ('anstellbar', str) |
  529.           rwAskChef   : MagicStrings.Append ('Chef fragen', str) |
  530.           rwAskSysop  : MagicStrings.Append ('Sysop fragen', str) |
  531.           rwImpossible: MagicStrings.Append ('unm”glich', str) |
  532.         ELSE
  533.         END;
  534.         MagicStrings.Append ('  ', str);
  535.       END;
  536.     END;
  537.     IF gr^.isNet # nNA
  538.     THEN
  539.       CASE gr^.isNet OF
  540.         nNetLokal,
  541.         nNet    : MagicStrings.Append ('Vernetzt', str); |
  542.         nLokal  : MagicStrings.Append ('Lokal', str); |
  543.         nNetForbid: MagicStrings.Append ('Diese Gruppe ist fr diese Box nicht bestellbar.', str); |
  544.       ELSE
  545.       END;
  546.       MagicStrings.Append ('  ', str);
  547.     END;
  548.     (*
  549.     IF gr^.userState # uNA
  550.     THEN
  551.       MagicStrings.Append ('Sie sind ', str);
  552.       CASE gr^.userState OF
  553.         uIsChef : MagicStrings.Append ('der Chef', str) |
  554.         uIsUser : MagicStrings.Append ('Mitglied', str) |
  555.         uNoUser : MagicStrings.Append ('kein Mitglied', str) |
  556.       ELSE
  557.       END;
  558.       MagicStrings.Append (' der Gruppe', str);
  559.     END;
  560.     *)
  561.     mtUtils.SetObjcString (groups, MausTauschrsc.groupinf2, str);
  562.     (* Button richtig setzen *)
  563.     IF ~followUpSelect & mtUtils.InState (groups, MausTauschrsc.grorder, MagicAES.DISABLED)
  564.     THEN
  565.       mtUtils.SetState (groups, MausTauschrsc.grchef, MagicAES.DISABLED, ~isSysop);
  566.       mtUtils.SetState (groups, MausTauschrsc.grorder, MagicAES.DISABLED, FALSE);
  567.       mtUtils.SetState (groups, MausTauschrsc.grfollow, MagicAES.DISABLED, FALSE);
  568.       WinDials.WinDialDraw (groups, MausTauschrsc.grchef, 0, v.r, FALSE);
  569.       WinDials.WinDialDraw (groups, MausTauschrsc.grorder, 0, v.r, FALSE);
  570.       WinDials.WinDialDraw (groups, MausTauschrsc.grfollow, 0, v.r, FALSE);
  571.     ELSIF followUpSelect & ~mtUtils.InState (groups, MausTauschrsc.grorder, MagicAES.DISABLED)
  572.     THEN
  573.       mtUtils.SetState (groups, MausTauschrsc.grchef, MagicAES.DISABLED, TRUE);
  574.       mtUtils.SetState (groups, MausTauschrsc.grorder, MagicAES.DISABLED, TRUE);
  575.       mtUtils.SetState (groups, MausTauschrsc.grfollow, MagicAES.DISABLED, TRUE);
  576.       WinDials.WinDialDraw (groups, MausTauschrsc.grchef, 0, v.r, FALSE);
  577.       WinDials.WinDialDraw (groups, MausTauschrsc.grorder, 0, v.r, FALSE);
  578.       WinDials.WinDialDraw (groups, MausTauschrsc.grfollow, 0, v.r, FALSE);
  579.     END;
  580.     IF ~followUpSelect
  581.     THEN
  582.       grIsOn := ((gr^.readState = rwOn) OR (gr^.readState = rwDefault) OR (gr^.ordered = oOn)) & ~(gr^.ordered = oOff);
  583.       IF ~grIsOn & buttonOrder
  584.       THEN
  585.         (* Buttontext auf bestellen setzen *)
  586.         mtUtils.SetObjcString (groups, MausTauschrsc.grorder, '[Bestellen');
  587.         buttonOrder := FALSE;
  588.         WinDials.WinDialDraw (groups, MausTauschrsc.grorder, 0, v.r, FALSE);
  589.       ELSIF grIsOn & ~buttonOrder
  590.       THEN
  591.         (* Buttontext auf Abstellen setzen *)
  592.         mtUtils.SetObjcString (groups, MausTauschrsc.grorder, 'A[bstellen');
  593.         buttonOrder := TRUE;
  594.         WinDials.WinDialDraw (groups, MausTauschrsc.grorder, 0, v.r, FALSE);
  595.       END;
  596.     END;
  597.     (* Und jetzt alles zeichnen *)
  598.     mtUtils.CalcArea (groups, MausTauschrsc.groupinf1, r1);
  599.     mtUtils.CalcArea (groups, MausTauschrsc.groupinf2, r2);
  600.     r1 := GrafBase.FrameRects (r1, r2);
  601.     WinDials.WinDialDraw (groups, 0, 8, r1, TRUE);
  602.   ELSE
  603.     (* Textzeilen unten l”schen *)
  604.     MagicStrings.Assign ('', str);
  605.     mtUtils.SetObjcString (groups, MausTauschrsc.groupinf1, str);
  606.     mtUtils.SetObjcString (groups, MausTauschrsc.groupinf2, str);
  607.     (* Buttons disablen *)
  608.     mtUtils.SetState (groups, MausTauschrsc.grorder, MagicAES.DISABLED, TRUE);
  609.     mtUtils.SetState (groups, MausTauschrsc.grfollow, MagicAES.DISABLED, TRUE);
  610.     mtUtils.SetState (groups, MausTauschrsc.grchef, MagicAES.DISABLED, TRUE);
  611.     (* Und jetzt alles zeichnen *)
  612.     mtUtils.CalcArea (groups, MausTauschrsc.groupinf1, v.r);
  613.     WinDials.WinDialDraw (groups, 0, 8, v.r, TRUE);
  614.     mtUtils.CalcArea (groups, MausTauschrsc.groupinf2, v.r);
  615.     WinDials.WinDialDraw (groups, 0, 8, v.r, TRUE);
  616.     WinDials.WinDialDraw (groups, MausTauschrsc.grorder, 0, v.r, FALSE);
  617.     WinDials.WinDialDraw (groups, MausTauschrsc.grfollow, 0, v.r, FALSE);
  618.     WinDials.WinDialDraw (groups, MausTauschrsc.grchef, 0, v.r, FALSE);
  619.   END;
  620. END updateButton;
  621.  
  622. (* List-Zwischen-Prozeduren *)
  623. PROCEDURE groupIsSelected (entry, env : ADDRESS) : BOOLEAN;
  624.   VAR ent : GroupSelect.groupPtr;
  625. BEGIN
  626.   ent := entry;
  627.   RETURN ent^.selected;
  628. END groupIsSelected;
  629.  
  630. PROCEDURE isEnabled (adr : ADDRESS; env : ADDRESS) : BOOLEAN;
  631. BEGIN
  632.   RETURN TRUE
  633. END isEnabled;
  634.  
  635. PROCEDURE countEntries ( l : ADDRESS; VAR ll: LONGINT; VAR ww: INTEGER);
  636.  VAR lp : POINTER TO Lists.List;
  637. BEGIN
  638.  lp := l;
  639.  ww := globalLength*mtAppl.CharWidth;
  640.  ll := VAL (LONGINT, Lists.NoOfEntries (lp^));
  641. END countEntries;
  642.  
  643. VAR  tr     : mtUtils.tObjcTree;
  644.  
  645. PROCEDURE drawGroupEntry (entry, env : ADDRESS; x, y : INTEGER;
  646.                           offset : INTEGER; clip   : GrafBase.Rectangle);
  647.  
  648.   CONST spaceString = "          ";
  649.      VAR e   : GroupSelect.groupPtr;
  650.          str : ARRAY [0..255] OF CHAR;
  651.   BEGIN
  652.     e := entry;
  653.     tr^[0].obX := x;
  654.     tr^[0].obY := y;
  655.     tr^[0].obSpec.TedPtr^.teTxtlen := globalLength;
  656.     tr^[0].obWidth := globalLength*mtAppl.CharWidth;
  657.     IF e # NIL
  658.     THEN
  659.       (* Jetzt hier den String fr den Gruppennamen zusammenbauen *)
  660.       buildGroup (e, env,  str);
  661.       mtUtils.SetObjcStringAdr (tr, 0, ADR(str));
  662.       mtUtils.SetState (tr, 0, MagicAES.SELECTED, groupIsSelected (entry, env));
  663.       mtUtils.SetState (tr, 0, MagicAES.DISABLED, ~isEnabled (entry, env));
  664.     ELSE
  665.       mtUtils.SetObjcStringAdr (tr, 0, CADR(spaceString));
  666.       mtUtils.SetState (tr, 0, MagicAES.SELECTED, FALSE);
  667.       mtUtils.SetState (tr, 0, MagicAES.DISABLED, FALSE);
  668.     END;
  669.     MagicAES.ObjcDraw (tr, 0, 8, clip);
  670.   END drawGroupEntry;
  671.  
  672. PROCEDURE setAndGetGroupValues (tree: ADDRESS; private: ADDRESS; set: BOOLEAN; exitBut: INTEGER);
  673. BEGIN
  674.   IF set
  675.   THEN
  676.   ELSE
  677.     IF exitBut # MausTauschrsc.groupabr
  678.     THEN
  679.       v.bool := GroupSelect.UpdateSelectList (grList, TRUE);
  680.     END;
  681.     (* Gruppenliste wieder freigeben *)
  682.     GroupSelect.DeleteList (grList);
  683.     (* Dialog wieder freigeben *)
  684.     IF exitBut = MausTauschrsc.grorder
  685.     THEN
  686.       IF grinTools.BetreffHolen(-1, Wegen, 'Stichwort fr neue pers”nliche Nachricht an:',
  687.                                 Adressat, 'Wegen:', FALSE) 
  688.       THEN
  689.         Messages.NewPersMsg (Adressat, "", Wegen);
  690.       END;
  691.     END;
  692.   END;
  693. END setAndGetGroupValues;
  694.  
  695. PROCEDURE checkGroupExit (tree: ADDRESS; private: ADDRESS; button: INTEGER;
  696.                           group: ADDRESS; kState: BITSET): BOOLEAN;
  697.   VAR groupName : ARRAY [0..255] OF CHAR;
  698.       gr        : GroupSelect.groupPtr;
  699.       str1,
  700.       str2      : CatTypes.String255;
  701.       oneSel    : BOOLEAN;
  702.       error     : BOOLEAN;
  703. BEGIN
  704.   error := FALSE;
  705.   IF ~followUpSelect THEN 
  706.     RETURN TRUE 
  707.   ELSIF button = MausTauschrsc.groupok
  708.   THEN
  709.     (* Selektierten Eintrag suchen *)
  710.     Lists.ResetList (grList);
  711.     Lists.ScanEntries (grList, Lists.forward, findSel, NIL, oneSel);
  712.     IF oneSel
  713.     THEN
  714.       (* Eintrag holen *)
  715.       gr := Lists.CurrentEntry (grList);
  716.       (* Jetzt Namen vergleichen *)
  717.       MagicStrings.Assign (followUpEntry^.name^, str1);
  718.       MagicStrings.Assign (gr^.name^, str2);
  719.       MagicStrings.CAPS (str1);
  720.       MagicStrings.CAPS (str2);
  721.       IF MagicStrings.Equal (str1, str2)
  722.       THEN
  723.         MTE.info (MTE.sameGroupError);
  724.         error := TRUE;
  725.       ELSE
  726.         (* Followup neu setzen *)
  727.         GroupSelect.SetFollowUp (followUpEntry, gr^.name^);
  728.         followUpSelect := FALSE;
  729.       END;
  730.     ELSE
  731.       followUpSelect := FALSE;
  732.     END;
  733.   ELSE
  734.     followUpSelect := FALSE;
  735.   END;
  736.   IF ~error
  737.   THEN
  738.     mtUtils.SetFlag (groups, MausTauschrsc.grchef, MagicAES.HIDETREE, FALSE);
  739.     mtUtils.SetFlag (groups, MausTauschrsc.grorder, MagicAES.HIDETREE, FALSE);
  740.     mtUtils.SetFlag (groups, MausTauschrsc.grfollow, MagicAES.HIDETREE, FALSE);
  741.     mtUtils.SetObjcString (groups, MausTauschrsc.grtitle, cSelGroup);
  742.     WinDials.WinUpdateTitle (groups);
  743.     mtUtils.ExclState (groups, button, MagicAES.SELECTED);
  744.     (* Full Redraw ber Dialog *)
  745.     WinDials.WinDialDraw (groups, 0, 8, v.r, FALSE);
  746.   END;
  747.   RETURN FALSE;
  748. END checkGroupExit;
  749.  
  750. PROCEDURE DoGroupSelect(dial : ADDRESS);
  751.   VAR specials : ARRAY [0..7] OF ListDl.specialButHdler;
  752.       gr,
  753.       group    : GroupSelect.groupPtr;
  754.       maxLength,
  755.       l        : INTEGER;
  756.       str1,
  757.       str2     : CatTypes.String255;
  758.       r        : GrafBase.Rectangle;
  759.       oneSel   : BOOLEAN;
  760.       oldFsel  : BOOLEAN;
  761.       dialHandler: ListDl.ldHandler;
  762.       sort     : INTEGER;
  763.       sortTypeSel: mtUtils.tObjcTree;
  764. BEGIN
  765.   followUpSelect := FALSE;
  766.   (* Baumadresse setzen *)
  767.   groups := dial;
  768.   (* Sysop feststellen *)
  769.   isSysop := Infofiles.IsInfoFile ('ISB', TRUE);
  770.   (* Titel setzen *)
  771.   mtUtils.SetObjcString (groups, MausTauschrsc.grtitle, cSelGroup);
  772.   (* Dial erstellen *)
  773.  
  774.   (* Sortierung einstellen *)
  775.   ConfVars.GetConfDefInt (cSortSelectList, sort, 0);
  776.   sortTypeSel := MausTauschrsc.TreeAddr^[MausTauschrsc.sorttype];
  777.   VDIUtil.SetXState (groups, MausTauschrsc.grsort1, ORD(sort));
  778.   VDIUtil.SetXString (groups, MausTauschrsc.grsort1, sortTypeSel, ORD(sort));
  779.  
  780.   ConfVars.GetConfDefBool (cLokalSelectList, oneSel, FALSE);
  781.   IF ~GroupSelect.GetSelectList (grList, oneSel, GroupSelect.selSortType (sort))
  782.   THEN
  783.     MTE.noMemAlert();
  784.     RETURN 
  785.   END;
  786.   mtUtils.SetState (groups, MausTauschrsc.grlokal, MagicAES.SELECTED, oneSel);
  787.   (* Texte unten leeren *)
  788.   MagicStrings.Assign ('', str1);
  789.   mtUtils.SetObjcString (groups, MausTauschrsc.grname, str1);
  790.   mtUtils.SetObjcString (groups, MausTauschrsc.groupinf1, str1);
  791.   mtUtils.SetObjcString (groups, MausTauschrsc.groupinf2, str1);
  792.   (* specials bestimmen *)
  793.   specials[0].objc := MausTauschrsc.grorder;
  794.   specials[0].proc := orderGroup;
  795.   specials[1].objc := MausTauschrsc.grfollow;
  796.   specials[1].proc := followUpTo;
  797.   specials[2].objc := MausTauschrsc.grhelp;
  798.   specials[2].proc := doHelp;
  799.   specials[3].objc := MausTauschrsc.grchef;
  800.   specials[3].proc := doChef;
  801.   specials[4].objc := MausTauschrsc.grlokal;
  802.   specials[4].proc := switchLokal;
  803.   specials[5].objc := MausTauschrsc.grsort0;
  804.   specials[5].proc := switchSort;
  805.   specials[6].objc := MausTauschrsc.grsort1;
  806.   specials[6].proc := switchSort;
  807.   specials[7].objc := MausTauschrsc.grsort2;
  808.   specials[7].proc := switchSort;
  809.  
  810.   (* Maximale Breite eines Gruppennamens herausfinden *)
  811.   maxGroupNameLength := 0;
  812.   Lists.ResetList (grList);
  813.   group := Lists.NextEntry (grList);
  814.   WHILE group # NIL DO 
  815.     l := LENGTH (group^.name^);
  816.     IF l > maxGroupNameLength 
  817.     THEN
  818.       maxGroupNameLength := l;
  819.     END;
  820.     group := Lists.NextEntry (grList);
  821.   END;
  822.  
  823.   (* Maximale Breite eines Listeneintrages herausfinden *)
  824.   maxLength := 0;
  825.   Lists.ResetList (grList);
  826.   group := Lists.NextEntry (grList);
  827.   WHILE group # NIL DO 
  828.     buildGroup (group, NIL, str1);
  829.     l := LENGTH (str1);
  830.     IF l > maxLength 
  831.     THEN
  832.       maxLength := l;
  833.     END;
  834.     group := Lists.NextEntry (grList);
  835.   END;
  836.   INC (maxLength);
  837.   
  838.   (* Jetzt das Object zusammenbauen *)
  839.   mtUtils.CalcArea (groups, MausTauschrsc.groupbox, r);
  840.   maxLength := BinOps.HigherInt (maxLength, r.w DIV mtAppl.CharWidth);
  841.   
  842.   globalLength := maxLength;
  843.  
  844.   (* Objectadresse holen *)
  845.   tr := MausTauschrsc.TreeAddr^[MausTauschrsc.listtxt];
  846.  
  847.   (* WindowDialog vorbereiten *)
  848.   ListDl.BuildLdHandler (ADR(grList), 
  849.                          ListHelp.resetList, 
  850.                          ListHelp.nextEntry, 
  851.                          ListHelp.prevEntry,
  852.                          countEntries, 
  853.                          isEnabled, 
  854.                          selGrEntry,
  855.                          groupToStr, groupIsSelected, 
  856.                          drawGroupEntry,
  857.                          0, mtAppl.CharHeight, 
  858.                          8, maxLength*mtAppl.CharWidth,
  859.                          dialHandler);
  860.   
  861.   LOOP
  862.   (* ListWinDialog ”ffnen *)
  863.     oldFsel := followUpSelect;
  864.     IF ListDl.WinListDial (groups, ListDl.ldElemSet{ldSelect, ldArrows, ldAutolocate, ldModal},
  865.                          dialHandler,
  866.                          MausTauschrsc.grordbox,
  867.                          MausTauschrsc.grordback,
  868.                          MausTauschrsc.groupok,
  869.                          MausTauschrsc.groupabr,
  870.                          NIL, 0,
  871.                          MausTauschrsc.grname,
  872.                          updateButton,
  873.                          specials,
  874.                          8,
  875.                          checkGroupExit,
  876.                          setAndGetGroupValues,
  877.                          setAndGetGroupValues,
  878.                          group)
  879.     THEN
  880.  
  881.     END;
  882.     IF followUpSelect = oldFsel
  883.     THEN
  884.       EXIT;
  885.     END;
  886.   END;
  887. END DoGroupSelect;
  888.  
  889. END GruppenAuswahl.
  890.